#ifndef __VIDEORECORD_H__ 
#define __VIDEORECORD_H__

#include "MySQLClient.hpp"

extern "C"
{
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
#include <libavcodec/avcodec.h>
}

#include <string>
#include <thread>
using std::string;

// RTSP流处理与录像类
class RTSPRecorder {
public:
    RTSPRecorder(const string& rtspUrl, const string& cameraId, 
                 int maxFileSize = 100*1024*1024, // 100M
                 int maxDuration = 400) :      // 1小时
        _rtspUrl(rtspUrl), _cameraId(cameraId),
        _maxFileSize(maxFileSize), _maxDuration(maxDuration),
        _isRecording(false), _currentFileSize(0),
        _startTime(0), _currentPts(0) {}

    ~RTSPRecorder();

    // 开始录像
    bool startRecord();
    
    // 停止录像
    void stopRecord();
    
    // 循环处理流
    void processLoop();
    
    // 获取当前是否在录像
    bool isRecording() const { return _isRecording; }

private:
    // 创建新的录像文件
    bool createNewFile();
    
    // 关闭当前文件并更新数据库
    void closeCurrentFile();
    
    // 初始化FFmpeg
    bool initFFmpeg();
    
    // 释放FFmpeg资源
    void releaseFFmpeg();

private:
    string _rtspUrl;          // RTSP地址
    string _cameraId;         // 摄像头ID
    int _maxFileSize;         // 最大文件大小(字节)
    int _maxDuration;         // 最大时长(秒)
    bool _isRecording;        // 是否正在录像
    string _currentFilePath;  // 当前文件路径
    long _currentFileSize;    // 当前文件大小
    time_t _startTime;        // 当前文件开始时间
    int64_t _currentPts;      // 当前PTS时间戳
    std::thread _recordThread;  // 线程对象
    
    // FFmpeg相关
    AVFormatContext* _fmtCtx = nullptr;
    AVFormatContext* _outFmtCtx = nullptr;
    int _videoStreamIndex = -1;
};


#endif

